home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1997-04-23 | 3.8 KB | 111 lines | [TEXT/3PRM] |
- implementation module timerDevice;
-
- import StdClass;
- import StdInt, StdBool;
- import ioState;
-
- TimerDeviceError :: String String -> .x;
- TimerDeviceError f error = Error f "timerDevice" error;
-
- :: DeltaFunction *s :== !s -> *(!(IOState s) -> (!s, !IOState s));
-
- TimerFunctions :: DeviceFunctions *s;
- TimerFunctions = (ShowTimer, OpenTimer, TimerIO, CloseTimer, HideTimer);
-
- ShowTimer :: !(IOState s) -> IOState s;
- ShowTimer ioState = ioState;
-
- OpenTimer :: !(DeviceSystem s (IOState s)) !(IOState s) -> IOState s;
- OpenTimer (TimerSystem timers) ioState
- = IOStateSetDevice (IOStateSetToolbox tb1 ioState1) (TimerSystemState tHs);
- where {
- (tb, ioState1) = IOStateGetToolbox ioState;
- (tHs,tb1) = OpenTimers timers [] tb;
- };
- OpenTimer _ _
- = TimerDeviceError "OpenTimer" "argument is no TimerSystem";
-
- OpenTimers :: ![TimerDef s (IOState s)] ![TimerHandle s] !Toolbox -> (![TimerHandle s],!Toolbox);
- OpenTimers tDefs tHs tb = StateMap2 OpenTimers` tDefs (tHs,tb);
-
- OpenTimers` :: !(TimerDef s (IOState s)) !(![TimerHandle s],!Toolbox) -> (![TimerHandle s],!Toolbox);
- OpenTimers` tDef (tHs,tb)
- | TimerHandlesContainId tHs id = (tHs, tb);
- = ([(ValidateTimer tDef, time) : tHs], tb1);
- where {
- (id,_,_,_) = TimerDef_Attributes tDef;
- (time, tb1) = TickCount tb;
- };
-
- TimerHandlesContainId :: ![TimerHandle s] !TimerId -> Bool;
- TimerHandlesContainId [(tDef, sampleTime) : tHs] id
- | id <> id` = TimerHandlesContainId tHs id;
- = True;
- where {
- (id`,_,_,_) = TimerDef_Attributes tDef;
- };
- TimerHandlesContainId _ _ = False;
-
- ValidateTimer :: !(TimerDef s (IOState s)) -> TimerDef s (IOState s);
- ValidateTimer tDef
- | intervalTime >= 0 = tDef;
- = TimerDef_SetInterval tDef 0;
- where {
- (_,_,intervalTime,_) = TimerDef_Attributes tDef;
- };
-
-
- /* Note: normally the timer device yields False in order to pass events to the other
- devices as well. The only exception should be when one of the event handlers
- quits the interaction. In that case the Boolean result must be True.
- */
- TimerIO :: !Event !*s !(IOState *s) -> (!Bool, !*s, !IOState *s);
- TimerIO (b,event,m,eventTime,h,v,mods) state ioState
- | event == UpdateEvent || event == ActivateEvent = (False, state, ioState);
- = ApplyTimers fs state ioState2;
- where {
- (timers,ioState1) = IOStateGetDevice ioState TimerDevice;
- tHs = TimerSystemState_TimerHandles timers;
- (tHs1, fs) = LetTimersDoIO eventTime tHs;
- ioState2 = IOStateSetDevice ioState1 (TimerSystemState tHs1);
- };
-
- TimerSystemState_TimerHandles :: !(DeviceSystemState s) -> TimerHandles s;
- TimerSystemState_TimerHandles (TimerSystemState timers) = timers;
- TimerSystemState_TimerHandles _
- = TimerDeviceError "TimerSystemState_TimerHandles" "argument is no TimerSystemState";
-
- LetTimersDoIO :: !Int !(TimerHandles s) -> (!TimerHandles s, ![DeltaFunction s]);
- LetTimersDoIO eventTime [tH=:(tDef, sampleTime) : tHs]
- | not (Enabled ability)
- = ([tH : tHs1], fs);
- | intervalTime==0
- = ([(tDef, eventTime) : tHs1], [f 1 : fs]);
- | timePassed < intervalTime
- = ([tH : tHs1], fs);
- = ([(tDef, sampleTime1) : tHs1], [f nrOfTimes : fs]);
- where {
- nrOfTimes = timePassed / intervalTime;
- timePassed = eventTime - sampleTime;
- sampleTime1 = sampleTime + nrOfTimes * intervalTime;
- (_,ability,intervalTime,f) = TimerDef_Attributes tDef;
- (tHs1, fs) = LetTimersDoIO eventTime tHs;
- };
- LetTimersDoIO _ tHs = (tHs, []);
-
- ApplyTimers :: ![DeltaFunction *s] !*s !(IOState *s) -> (!Bool, !*s, !IOState *s);
- ApplyTimers [f : fs] s ioState
- | closed = (closed, s1, ioState2);
- = ApplyTimers fs s1 ioState2;
- where {
- (s1, ioState1) = f s ioState;
- (closed, ioState2) = IOStateClosed ioState1;
- };
- ApplyTimers _ s ioState = (False, s, ioState);
-
- CloseTimer :: !(IOState s) -> IOState s;
- CloseTimer ioState = IOStateRemoveDevice ioState TimerDevice;
-
- HideTimer :: !(IOState s) -> IOState s;
- HideTimer ioState = ioState;
-